package com.nowcoder.q3_7;


import java.util.ArrayList;

/**
 有家动物收容所只收留猫和狗，但有特殊的收养规则，收养人有两种收养方式：
 1、直接收养所有动物中最早进入收容所的；
 2、选择收养的动物类型（猫或狗），并收养该种动物中最早进入收容所的。
 给定一个操作序列int[][2] ope代表所有事件。
 若第一个元素为1，则代表有动物进入收容所，第二个元素为动物的编号，正数代表狗，负数代表猫；
 若第一个元素为2，则代表有人收养动物，第二个元素若为0，则采取第一种收养方式，若为1，则指定收养狗，若为-1则指定收养猫。
 请按顺序返回收养的序列。若出现不合法的操作，即没有可以符合领养要求的动物，则将这次领养操作忽略。
 测试样例：
 {{1,1},{1,-1},{2,0},{2,-1}}
 返回：{1,-1}
 */
public class CatDogAsylum {
    //思路：
    //按顺序思路执行即可
    public ArrayList<Integer> asylum(int[][] ope) {
        //创建动物序列和结果序列
        ArrayList<Integer> animals = new ArrayList<Integer>();
        ArrayList<Integer> result = new ArrayList<Integer>();

        //遍历将动物序列，判断并执行操作
        for (int i = 0; i < ope.length; i++) {
            if (ope[i][0] == 1) {
                animals.add(ope[i][1]);
            } else {
                //输入了范围外的数字，不符要求
                if (ope[i][0] != 2) {
                    return null;
                }

                switch (ope[i][1]) {
                    //收养最早进入收养所的动物
                    case 0:
                        if (animals.size() == 0) {
                            break;
                        }
                        result.add(animals.get(0));
                        animals.remove(0);
                        break;

                    //收养最早进入的狗
                    case 1:
                        if (animals.size() == 0) {
                            break;
                        }

                        int countDog = 0; //初始为0，如果遍历完仍为0，说明没有狗可以取，操作取消
                        for (int j = 0; j < animals.size(); j++) {
                            if (animals.get(j) > 0) {
                                countDog++;
                                result.add(animals.get(j));
                                animals.remove(j);
                                break;
                            }
                        }

                        if (countDog == 0) {
                            break;
                        }

                        break;

                    //收养最早进入的猫
                    case -1:
                        if (animals.size() == 0) {
                            break;
                        }

                        int countCat = 0; //初始为0，如果遍历完仍为0，说明没有猫可以取，操作取消
                        for (int j = 0; j < animals.size(); j++) {
                            if (animals.get(j) < 0) {
                                countCat++;
                                result.add(animals.get(j));
                                animals.remove(j);
                                break;
                            }
                        }

                        if (countCat == 0) {
                            break;
                        }

                        break;

                    //输入了规定范围外的数字，不符要求
                    default:
                        return null;
                }
            }
        }

        return result;
    }

    //测试
    public static void main(String[] args) {
        int[][] ope = {{1,-3},{1,-6},{1,10},{1,3},{2,0},{1,19},{2,-1},{1,-81},{1,36},{2,0},{2,1},{1,66},{2,0},{1,-13},{2,0},{2,-1},{2,0},{1,29},{2,1},{2,1},{2,1},{1,56},{1,-99},{2,-1},{2,-1},{1,79},{1,-25},{1,-6},{1,63},{1,48},{1,-40},{1,56},{2,1},{1,28},{1,78},{1,20},{1,18},{1,20},{1,-92},{1,87},{2,0},{1,34},{2,-1},{1,96},{1,38},{2,0},{2,-1},{1,17},{1,13},{1,3},{1,-26},{2,0},{2,0},{2,-1},{2,1},{2,0},{1,-78},{1,57},{1,71},{1,-11},{2,-1},{1,-28},{1,-28},{1,-87},{1,-86},{1,-9},{1,50},{2,1},{2,0},{1,65},{1,-98},{1,-54},{2,0},{2,-1},{1,84},{1,-72},{1,-42},{1,77},{1,-61},{1,-61},{1,-11},{1,94},{2,1},{1,93},{2,-1},{2,-1},{1,43},{2,-1},{1,-72},{2,-1},{1,-31},{1,-41},{1,-85},{1,-2},{2,0},{1,94},{1,80},{1,-86},{1,-83},{1,-20},{1,49},{1,-47},{1,46},{1,34},{2,1},{2,0},{1,-41},{2,1},{2,-1},{1,-44},{1,100},{1,-85},{1,-25},{1,-8},{1,-69},{1,13},{1,82},{2,1},{1,-41},{1,-44},{1,22},{1,-72},{1,-16},{1,-11},{1,65},{1,-66},{1,25},{1,-31},{1,-63},{2,1},{1,86},{1,2},{1,6},{1,-42},{1,-9},{1,76},{1,54},{2,0},{2,1}} ;
        CatDogAsylum test = new CatDogAsylum();
        ArrayList<Integer> result = test.asylum(ope);
        for (Integer temp : result) {
            System.out.print(temp + " ");
        }
    }
}
